const _ = require('lodash');

// 在新的课程中，学习到了 组合函数的概念，什么是组合函数呢？

// 首先，实现一个数组中最后一个元素大写
function comeposeFun(fn1, fn2, fn3) {
  return function(array) {
    // console.log(Array.from(...arguments))
    return (fn1(fn2(fn3(array))))
  }
}

function reverse(array) {
  return array.reverse();
}

function first(array) {
  return array[0];
}

function toUpperCase(val) {
  return val.toUpperCase();
}

const comepose = comeposeFun(toUpperCase, first, reverse);
// console.log(comepose(['one', 'two', 'three']));

// 看完以上操作，组合函数的大致结构已经出来了
// 但是这样调用的话，像洋葱一样，一圈一圈的。。。
// 尝试优化下
function newComeposeFun(...args) {
  return function(value) {
    return args.reverse().reduce((a, b) => {
      console.log(a, 'value');
      return b(a);
    }, value);
  }
}
// 使用箭头函数的形式
const arrowComeposeFun = (...args) => value => args.reverse().reduce((a, b) => b(a), value);
const newComepose = arrowComeposeFun(toUpperCase, first, reverse);
// console.log(newComepose(['one', 'two', 'three']));

// 函数组合调试案例
// HELLO WORLD ==> hello-world
const split = _.curry((reg, str) => _.split(str, reg));
const join = _.curry((reg, array) => _.join(array, reg));
const log = _.curry((type, value) => { console.log(type, value); return value });

// 自己写的
// const newFlow = _.flowRight(_.toLower, join('-'), split(' '));

// 导师设置的一个错误
const map = _.curry((fun, array) => _.map(array, fun));
// const newFlow = _.flowRight(join('-'), _.toLower, log('split后面'), split(' '));

// 修正后
const newFlow = _.flowRight(join('-'), map(_.toLower), split(' '));
// console.log(newFlow('HELLO WORLD'), '非fp');
// 在这里注意下 ~ ~ lodash 的 join 方法会判断当前是不是数组，如果不是，会变成数组
// console.log(join('-', 'hello,world'), 'hello,world');// h-e-l-l-o-,-w-o-r-l-d
// console.log(Array.from('hello,world'));// [ 'h', 'e', 'l', 'l', 'o', ',', 'w', 'o', 'r', 'l', 'd' ]

const fp = require('lodash/fp');
// const fpFlow = fp.flowRight(fp.join('-'), fp.map(fp.toLower), log(1), fp.split(' '));
// 在这个地方其实自己陷入了一个误区，本来理解的是柯里化函数需要把所有参数传递完毕
// 但是这个地方只是调用了一次 fp.xxx 方法，为什么结果就返回了呢？
// 在 flowRight 函数中，会再次执行，执行的时候会把另一个参数传递进去
const fpFlow = newComeposeFun(fp.join('-'), fp.map(fp.toLower), fp.split(' '));
// console.log(fpFlow('HELLO WORLD'), 'fp');
